package View;

import java.util.Iterator;
import java.util.List;

import DAO.AlunoDaoImplArquivo;
import DAO.AtividadeDaoImplArquivo;
import DAO.HistoricoTurmaDaoImplArquivo;
import DAO.NotaDaoImplArquivo;
import DAO.ProfessorDaoImplArquivo;
import DAO.TurmaDaoImplArquivo;
import Pojo.Aluno;
import Pojo.Atividade;
import Pojo.Nota;
import Pojo.Professor;
import Pojo.Turma;

/** Classe de operações referentes às notas.
*
* @author Thiago Schons
* 
* */
public class MenuNota {

	/**Método para lançamento de nota.
	 * 
	 * @param notaDao
	 * @param professorDao
	 * @param professorAcesso
	 * @param turmaDao
	 * @param atividadeDao
	 * @param alunoDao
	 * @param historicoTurmaDao
	 */
	public void lancarNota(NotaDaoImplArquivo notaDao, ProfessorDaoImplArquivo professorDao, Professor professorAcesso, TurmaDaoImplArquivo turmaDao, AtividadeDaoImplArquivo atividadeDao, AlunoDaoImplArquivo alunoDao, HistoricoTurmaDaoImplArquivo historicoTurmaDao){
		System.out.println("---Lançamento de Notas---");
		
		//escolhendo a turma
		List<Turma> listaTurmaProfessor = professorAcesso.getTurmas();
		if (listaTurmaProfessor.size()==0){
			System.out.println("Nenhuma turma abertta para este professor. Pressione Enter para continuar.");
			Console.readString();
			return;
		}
		this.mostrarListaTurmaProfessor(listaTurmaProfessor,turmaDao);
		int idTurma = Console.readInteger();
		Turma turma=turmaDao.pesquisarPorId(idTurma);
		while ((turma==null)||(turma.getProfessor().getIdProfessor()!=professorAcesso.getIdProfessor())){
			System.out.println("Entrada inválida. Informe novamente:");
			idTurma = Console.readInteger();
			turma=turmaDao.pesquisarPorId(idTurma);
		}
				
		//escolhendo a atividade a ter notas cadastradas
		List<Atividade> listaAtividadeTurma = atividadeDao.procurarPorTurma(idTurma);
		this.mostrarListaAtividadeTurma(listaAtividadeTurma);
		int idAtividade = Console.readInteger();
		Atividade atividade = atividadeDao.procurarPorId(idAtividade);
		while ((atividade==null)||(atividade.getTurma().getIdTurma()!=turma.getIdTurma())){
			System.out.println("Entrada inválida. Informe novamente:");
			idAtividade = Console.readInteger();
			atividade = atividadeDao.procurarPorId(idAtividade);
		}
		
		int continuar=1;
		int idAluno;
		int idNotaAux;
		int verificarSobrescreverNota;
		double notaValor;
		Nota nota;
		Aluno aluno;
		List<Aluno> listaAlunos = alunoDao.getListaAlunos();
		while(continuar==1){
			//escolhendo o aluno
			this.mostrarListaAlunos(listaAlunos,historicoTurmaDao,idTurma,idAtividade,notaDao);
			idAluno = Console.readInteger();
			aluno = alunoDao.procurarPorId(idAluno);
			while ((aluno==null)||(historicoTurmaDao.procurarPorAlunoETurma(aluno, turma)==null)){
				System.out.println("Entrada inválida. Informe novamente:");
				idAluno = Console.readInteger();
				aluno = alunoDao.procurarPorId(idAluno);
			}	
			
			idNotaAux = notaDao.verificarLancamento(idAluno, idAtividade);
						
			if (idNotaAux>0){
				System.out.println("Nota já cadastrada para esta atividade e para este aluno.\nDeseja sobrescrever a nota?(1-Sim, 0-Não)");
				verificarSobrescreverNota = Console.readInteger();
				if (verificarSobrescreverNota==1){
					this.lancarNota(notaDao, aluno, atividade, 1, idNotaAux);
				}
			}else{
				this.lancarNota(notaDao, aluno, atividade, 0, -1);
			}
			
			System.out.println("Deseja continuar lançando notas? (1- Sim, 0- Não)");
			continuar = Console.readInteger();
		}
	}
	
	/**Método para lançamento de nota com opção de sobrescrita.
	 * 
	 * @param notaDao
	 * @param aluno
	 * @param atividade
	 * @param sobrescrever
	 * @param idNotaAux
	 */
	public void lancarNota(NotaDaoImplArquivo notaDao, Aluno aluno, Atividade atividade, int sobrescrever,int idNotaAux){
		System.out.println("Informe a Nota (Valor="+atividade.getValor()+")");
		double notaValor = Console.readDouble();
		if ((notaValor>atividade.getValor())||(notaValor<0)){
			System.out.println("Nota inválida. Valor não salvo.");
		}else{
			Nota nota = new Nota(notaDao.getProximoId(),notaValor,aluno,atividade);	
			if (sobrescrever==1){
				notaDao.removerNota(idNotaAux);
			}
			notaDao.adicionarNota(nota);
			System.out.println("Nota lançada com sucesso!");
		}
	}
	
	/**Listagem de turmas por professor.
	 * 
	 * @param listaTurmaProfessor
	 * @param turmaDao
	 */
	private void mostrarListaTurmaProfessor(List<Turma> listaTurmaProfessor,TurmaDaoImplArquivo turmaDao){
		Iterator<Turma> i = listaTurmaProfessor.iterator();
		Turma turma;
		
		System.out.println("---Escolha a turma---");
		System.out.println("ID | Disciplina | Ano | Período");
		while(i.hasNext()){
			turma = (Turma) i.next();
			if (turma.getFinalizada()==false){
				System.out.println(turma.getIdTurma()+" | "+turmaDao.pesquisarPorId(turma.getIdTurma()).getDisciplina().getNome()+" | "+turma.getAno()+" | "+turma.getPeriodo());
			}
		}
		System.out.println("Digite o ID da Turma");
	}
	
	/**Listagem de atividades cadastradas em uma turma
	 * 
	 * @param listaAtividadeTurma
	 */
	private void mostrarListaAtividadeTurma(List<Atividade> listaAtividadeTurma){
		Iterator<Atividade> i = listaAtividadeTurma.iterator();
		Atividade atividade;
		
		System.out.println("---Escolha a atividade---");
		System.out.println("ID | Nome | Tipo | Data");
		while(i.hasNext()){
			atividade = (Atividade) i.next();
			System.out.println(atividade.getIdAtividade()+" | "+atividade.getNome()+" | "+atividade.getTipo()+" | "+atividade.getData().getTime());
		}
		System.out.println("Digite o ID da  atividade");
	}
	
	/**Listagem de alunos para cadastro de notas
	 * 
	 * @param listaAlunos
	 * @param historicoTurmaDao
	 * @param idTurma
	 * @param idAtividade
	 * @param notaDao
	 */
	private void mostrarListaAlunos(List<Aluno> listaAlunos,HistoricoTurmaDaoImplArquivo historicoTurmaDao,int idTurma, int idAtividade, NotaDaoImplArquivo notaDao){
		Iterator<Aluno> i = listaAlunos.iterator();
		Aluno aluno;
		int idHistoricoTurmaAux;
		int verificacaoDeLancamento;
		
		System.out.println("---Escolha o Aluno---");
		System.out.println("ID | Nome | CPF | Nota");
		while(i.hasNext()){
			aluno = (Aluno) i.next();
			idHistoricoTurmaAux = historicoTurmaDao.verificarAlunoCadastradoTurma(aluno.getIdAluno(), idTurma);
			if (idHistoricoTurmaAux>0){
				verificacaoDeLancamento = notaDao.verificarLancamento(aluno.getIdAluno(), idAtividade);
				if (verificacaoDeLancamento!=-1){
					System.out.println(aluno.getIdAluno()+" | "+aluno.getNome()+" | "+aluno.getCpf()+" | Cadastrada: "+notaDao.procurarPorId(verificacaoDeLancamento).getNota());	
				}else{
					System.out.println(aluno.getIdAluno()+" | "+aluno.getNome()+" | "+aluno.getCpf()+" | Ainda não cadastrada.");
				}
			}
		}
		System.out.println("Digite o ID do Aluno");
	}
	
}
